/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladorfuzzy;;

import java.util.ArrayList;

/**
 *
 * @author Administrador
 */
public class Fuzzificacao {

    ConjuntoFuzzy infravermelho;
    ConjuntoFuzzy sonarDistancia;
    ConjuntoFuzzy sonarAngulo;
    
    ArrayList<Expressao> expressoes;
    ArrayList<Integer> pontosInfravermelho = new ArrayList<Integer>();
    ArrayList<Integer> pontosSonarDistancia = new ArrayList<Integer>();
    ArrayList<Integer> pontosSonarAngulo = new ArrayList<Integer>();
    
    ArrayList<String> termosInfravermelho = new ArrayList<String>();
    ArrayList<String> termosSonarDistancia = new ArrayList<String>();
    ArrayList<String> termosSonarAngulo = new ArrayList<String>();
    

    public void definirPontos() {
        pontosInfravermelho.add(20);
        pontosInfravermelho.add(40);
        pontosInfravermelho.add(50);
        pontosInfravermelho.add(70);

        pontosSonarDistancia.add(60);
        pontosSonarDistancia.add(85);
        pontosSonarDistancia.add(115);
        pontosSonarDistancia.add(140);

        pontosSonarAngulo.add(15);
        pontosSonarAngulo.add(20);
        pontosSonarAngulo.add(25);
        pontosSonarAngulo.add(30);


    }

    public void definirTermos() {
        termosInfravermelho.add("perto");
        termosInfravermelho.add("medio");
        termosInfravermelho.add("longe");

        termosSonarDistancia.add("perto");
        termosSonarDistancia.add("medio");
        termosSonarDistancia.add("longe");

        termosSonarAngulo.add("pequeno");
        termosSonarAngulo.add("medio");
        termosSonarAngulo.add("grande");
    }

    public ArrayList<Expressao> fuzzificar(double entradaInfravermelho, double entradaSonarDistancia, double entradaSonarAngulo) {
        definirPontos();
        definirTermos();
        infravermelho = new ConjuntoFuzzy(pontosInfravermelho, termosInfravermelho);
        sonarDistancia = new ConjuntoFuzzy(pontosSonarDistancia, termosSonarDistancia);
        sonarAngulo = new ConjuntoFuzzy(pontosSonarAngulo, termosSonarAngulo);
        infravermelho.definirPertinencia(entradaInfravermelho);
        sonarDistancia.definirPertinencia(entradaSonarDistancia);
        sonarAngulo.definirPertinencia(entradaSonarAngulo);
//        System.out.println("Primeiro valor do infra: " + infravermelho.getPrimeiroValor());
//        System.out.println("Segundo valor do infra: " + infravermelho.getSegundoValor());
        gerarExpressoes();
        imprimirExpressoes();
        return expressoes;

    }

    public void gerarExpressoes() {
        expressoes = new ArrayList<Expressao>();

        Expressao expressao = new Expressao();
        expressao.setAntecedente1Pertinencia(infravermelho.getPrimeiraPertinencia());
        expressao.setAntecedente1valor(infravermelho.getPrimeiroValor());

        expressao.setAntecedente2Pertinencia(sonarDistancia.getPrimeiraPertinencia());
        expressao.setAntecedente2Valor(sonarDistancia.getPrimeiroValor());

        expressao.setAntecedente3Pertinencia(sonarAngulo.getPrimeiraPertinencia());
        expressao.setAntecedente3Valor(sonarAngulo.getPrimeiroValor());
        expressoes.add(expressao);


        if (sonarAngulo.getSegundaPertinencia() != 0) {
            expressao = new Expressao();
            expressao.setAntecedente1Pertinencia(infravermelho.getPrimeiraPertinencia());
            expressao.setAntecedente1valor(infravermelho.getPrimeiroValor());

            expressao.setAntecedente2Pertinencia(sonarDistancia.getPrimeiraPertinencia());
            expressao.setAntecedente2Valor(sonarDistancia.getPrimeiroValor());

            expressao.setAntecedente3Pertinencia(sonarAngulo.getSegundaPertinencia());
            expressao.setAntecedente3Valor(sonarAngulo.getSegundoValor());
            expressoes.add(expressao);

        }

        if (sonarDistancia.getSegundaPertinencia() != 0) {

            expressao = new Expressao();
            expressao.setAntecedente1Pertinencia(infravermelho.getPrimeiraPertinencia());
            expressao.setAntecedente1valor(infravermelho.getPrimeiroValor());

            expressao.setAntecedente2Pertinencia(sonarDistancia.getSegundaPertinencia());
            expressao.setAntecedente2Valor(sonarDistancia.getSegundoValor());

            expressao.setAntecedente3Pertinencia(sonarAngulo.getPrimeiraPertinencia());
            expressao.setAntecedente3Valor(sonarAngulo.getPrimeiroValor());
            expressoes.add(expressao);

            if (sonarAngulo.getSegundaPertinencia() != 0) {
                expressao = new Expressao();
                expressao.setAntecedente1Pertinencia(infravermelho.getPrimeiraPertinencia());
                expressao.setAntecedente1valor(infravermelho.getPrimeiroValor());

                expressao.setAntecedente2Pertinencia(sonarDistancia.getSegundaPertinencia());
                expressao.setAntecedente2Valor(sonarDistancia.getSegundoValor());

                expressao.setAntecedente3Pertinencia(sonarAngulo.getSegundaPertinencia());
                expressao.setAntecedente3Valor(sonarAngulo.getSegundoValor());
                expressoes.add(expressao);
            }
        }

        if (infravermelho.getSegundaPertinencia() != 0) {
            expressao = new Expressao();
            expressao.setAntecedente1Pertinencia(infravermelho.getSegundaPertinencia());
            expressao.setAntecedente1valor(infravermelho.getSegundoValor());

            expressao.setAntecedente2Pertinencia(sonarDistancia.getPrimeiraPertinencia());
            expressao.setAntecedente2Valor(sonarDistancia.getPrimeiroValor());

            expressao.setAntecedente3Pertinencia(sonarAngulo.getPrimeiraPertinencia());
            expressao.setAntecedente3Valor(sonarAngulo.getPrimeiroValor());
            expressoes.add(expressao);

            if (sonarAngulo.getSegundaPertinencia() != 0) {
                expressao = new Expressao();
                expressao.setAntecedente1Pertinencia(infravermelho.getSegundaPertinencia());
                expressao.setAntecedente1valor(infravermelho.getSegundoValor());

                expressao.setAntecedente2Pertinencia(sonarDistancia.getPrimeiraPertinencia());
                expressao.setAntecedente2Valor(sonarDistancia.getPrimeiroValor());

                expressao.setAntecedente3Pertinencia(sonarAngulo.getSegundaPertinencia());
                expressao.setAntecedente3Valor(sonarAngulo.getSegundoValor());
                expressoes.add(expressao);
            }

            if (sonarDistancia.getSegundaPertinencia() != 0) {
                expressao = new Expressao();
                expressao.setAntecedente1Pertinencia(infravermelho.getSegundaPertinencia());
                expressao.setAntecedente1valor(infravermelho.getSegundoValor());

                expressao.setAntecedente2Pertinencia(sonarDistancia.getSegundaPertinencia());
                expressao.setAntecedente2Valor(sonarDistancia.getSegundoValor());

                expressao.setAntecedente3Pertinencia(sonarAngulo.getPrimeiraPertinencia());
                expressao.setAntecedente3Valor(sonarAngulo.getPrimeiroValor());
                expressoes.add(expressao);

                if (sonarAngulo.getSegundaPertinencia() != 0) {
                    expressao = new Expressao();
                    expressao.setAntecedente1Pertinencia(infravermelho.getSegundaPertinencia());
                    expressao.setAntecedente1valor(infravermelho.getSegundoValor());
                    
                    expressao.setAntecedente2Pertinencia(sonarDistancia.getSegundaPertinencia());
                    expressao.setAntecedente2Valor(sonarDistancia.getSegundoValor());

                    expressao.setAntecedente3Pertinencia(sonarAngulo.getSegundaPertinencia());
                    expressao.setAntecedente3Valor(sonarAngulo.getSegundoValor());
                    expressoes.add(expressao);
                }
            }
        }
    }

    public void imprimirExpressoes() {
        System.out.println("");
        System.out.println("Imprimindo expressões geradas após a fuzzificação ");
        for (int i = 0; i < expressoes.size(); i++) {
            System.out.println(expressoes.get(i).getAntecedente1Pertinencia() + " " + expressoes.get(i).getAntecedente1valor()
                    + " E " + expressoes.get(i).getAntecedente2Pertinencia() + " " + expressoes.get(i).getAntecedente2Valor()
                    + " E " + expressoes.get(i).getAntecedente3Pertinencia() + " " + expressoes.get(i).getAntecedente3Valor());
        }
    }
}
